<?php

namespace tmcore\utils;

use think\Image;

/**
 * 图片压缩类
 * @package tmcore\utils
 */
class ImageProcess {

    public $image;

    /**
     * 初始化
     *
     * ImageProcess constructor.
     * @param string|object $file 图片路径或文件对象
     */
    public function __construct($file)
    {
        $image = Image::open($file);

        $this->image = $image;
        $this->image['width'] = $image->width(); //图片宽度
        $this->image['height'] = $image->height(); //图片高度
        $this->image['type'] = $image->type();//图片类型
        $this->image['mime'] = $image->mime();//图片mime类型
        $this->image['size'] = $image->size();//图片的尺寸数组 0 图片宽度 1 图片高度
    }

    /**
     * 获取image对象
     * @return Image
     */
    public function getImage() {
        return $this->image;
    }

    /**
     * 获取图片宽度
     * @return mixed
     */
    public function getWidth() {
        return $this->image['width'];
    }

    /**
     * 获取图片高度
     * @return mixed
     */
    public function getHeight() {
        return $this->image['height'];
    }

    /**
     * 获取图片类型
     * @return mixed
     */
    public function getType() {
        return $this->image['type'];
    }

    /**
     * 获取图片mime类型
     * @return mixed
     */
    public function getMime() {
        return $this->image['mime'];
    }

    /**
     * 图片的尺寸数组 0 图片宽度 1 图片高度
     * @return mixed
     */
    public function getSize() {
        return $this->image['size'];
    }

    /**
     * 裁剪图像
     *
     * @param  integer $w      裁剪区域宽度
     * @param  integer $h      裁剪区域高度
     * @param  integer $x      裁剪区域x坐标
     * @param  integer $y      裁剪区域y坐标
     * @param  integer $width  图像保存宽度
     * @param  integer $height 图像保存高度
     *
     * @return Image
     */
    public function crop($w, $h, $x = 0, $y = 0, $width = null, $height = null) {
        $this->image = $this->image->crop($w, $h, $x, $y, $width, $height);
        return $this->image;
    }

    /**
     * 生成缩略图
     *
     * @param integer $width 缩略图最大宽度
     * @param integer $height 缩略图最大高度
     * @param int $type 缩略图裁剪类型 1-等比例 2-缩放后填充 3-居中裁剪 4-左上角裁剪 5-右下角裁剪 6-固定尺寸缩放
     *
     * @return Image
     */
    public function thumb($width, $height, $type = 1) {
        $this->image = $this->image->thumb($width, $height, $type);
        return $this->image;
    }

    /**
     * 翻转图像
     * @param integer $direction 翻转轴 1-X 2-Y
     * @return Image
     */
    public function flip($direction = 1) {
        $this->image = $this->image->flip($direction);
        return $this->image;
    }

    /**
     * 旋转图像
     * @param int $degrees 顺时针旋转的度数
     * @return Image
     */
    public function rotate($degrees = 90) {
        $this->image = $this->image->rotate($degrees);
        return $this->image;
    }

    /**
     * 添加水印
     *
     * @param string $source 水印图片路径
     * @param int $locate 水印位置 1-左上角 2-上居中 3-右上角 4-左居中 5-居中 6-右居中 7-左下角 8-下居中 9-右下角
     * @param int $alpha 透明度
     * @return Image
     */
    public function water($source, $locate = 7, $alpha = 100) {
        $this->image = $this->image->water($source, $locate, $alpha);
        return $this->image;
    }

    /**
     * 图像添加文字
     *
     * @param string $text 添加的文字
     * @param string $font 字体路径
     * @param integer $size 字号
     * @param string $color 文字颜色
     * @param int $locate 文字写入位置 1-左上角 2-上居中 3-右上角 4-左居中 5-居中 6-右居中 7-左下角 8-下居中 9-右下角
     * @param integer $offset 文字相对当前位置的偏移量
     * @param integer $angle 文字倾斜角度
     *
     * @return Image
     */
    public function text($text, $font, $size, $color = '#00000000', $locate = 7, $offset = 0, $angle = 0) {
        $this->image = $this->image->text($text, $font, $size, $color, $locate, $offset, $angle);
        return $this->image;
    }

    /**
     * 保存图像
     * @param string $pathname 图像保存路径名称
     * @param null|string $type 图像类型
     * @param int $quality 图像质量
     * @param bool $interlace 是否对JPEG类型图像设置隔行扫描
     * @return Image
     */
    public function save($pathname, $type = null, $quality = 80, $interlace = true) {
        return $this->image->save($pathname, $type, $quality, $interlace);
    }

}